<?php

namespace app\wx\service;
use think\Db;
use Exception;
use app\common\cache\RedisPublic;

/**
 * 部门管理操作数据库
 */
class DepartmentService{
    const TABLE = 'department';

    /** 
     * 查询条件
     * @param array   $data   参数
     * @return array 
     */
    static private function map($data){
        $map = [];
        if($data['id']){
            $map['id'] = $data['id'];
        }
        if($data['name']){
            $map['name'] = $data['name'];
        }
        if($data['name_en']){
            $map['name_en'] = $data['name_en'];
        }
        if($data['start_time'] && $data['end_time']){ //交易时间
            $map['create_time'] = array(array("egt",$data['start_time']),array("elt",$data['end_time']));
        }
        return $map;
    }

    /**
     * 查询部门
     * @param array $param  查询条件
     * @param int $page  页面
     * @param int $limit 页面显示数量
     * @param string $field 查询字段
     * @return array
     */

    static public function findDepartment($param, $pp = 1, $num = 10,  $field = '*'){
        //查询条件
        $map = self::map($param);
        $count = Db::name(self::TABLE)->where($map)->count();
        //计算pp
        $pp = ceil($count / $num) < $pp ? ceil($count / $num) : $pp;
        //查询数据
        $list = Db::name(self::TABLE)->where($map)->order("id desc")->page($pp,$num)->field($field)->select();
        return [
            'list' => $list,
            'count' => $count,
            'pp' => $pp
        ];
    }

    /**
     * 添加部门
     * @param array 待添加数据
     * @return int 返回添加ID
     */
    static public function add($param)
    {
        $param['create_time'] = date('Y-m-d H:i:s');
        $id = Db::name(self::TABLE)->insertGetId($param);
        if(!$id){
            error('数据添加失败，mysql异常!');
        }
        return $id;
    }

    /**
     * 修改部门
     * @param array 待修改数据
     * @return void
     */
    static public function edit($param)
    {
        $param['update_time'] = date('Y-m-d H:i:s');
        $id = $param['id'];
        $result = Db::name(self::TABLE)->where('id',$id)->update($param);
        if(!$result){
            error('数据修改失败，mysql异常!');
        }
    }

    /**
     * 批量插入
     * @param array 待添加数据
     * 
     * @return void
     */
    static public function insertAll($department)
    {
        $insert_data = [];
        $redis_data = [];
        $i = 0;
        foreach($department as $k => $v)
        {
            //判断数据有没有在redis中，有则剔除
            $redis_exists = RedisPublic::setRedisTable(self::TABLE)->exists($v['id']);
            if($redis_exists === true)
                continue;
            $insert_data[$i] = $v;
            $insert_data[$i]['create_time'] = date('Y-m-d H:i:s');

            $redis_data[$v['id']] = json_encode($insert_data,JSON_UNESCAPED_UNICODE);
            $i++;
        }
        if(!empty($insert_data) && !empty($redis_data)){
            Db::startTrans();
            try{
                //插入数据库 
                $result_m = Db::name(self::TABLE)->insertAll($insert_data);
                if(!$result_m) throw new Exception('数据库插入异常');
                //插入redis
                $result_r = RedisPublic::setRedisTable(self::TABLE)->mset($redis_data);
                if($result_r === false) throw new Exception('redis插入异常');
                Db::commit();
            }catch (\Exception $e) {
                Db::rollback();
                exception($e->getMessage());
            }
        }
    }
}